From 8fd790e1beceaee4062b4694f0b699c12c5cfafe Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Thu, 29 Aug 2019 09:38:04 -0600 Subject: [PATCH] fix lowranceusr4 writer issues (#376) * fixes for lowraneusr writer for versions >= 4. use fs_chain_find when looking for FS_LOWRANCEUSR4 data. and check for nullptr to verify FS_LOWRANCEUSR4 data exists. * using rounding in lowranceusr lat/lon conversions. This gives as a chance of usr->gpx->usr matching. Update gpsbabel generated usr reference files for these rounding differences. * fix lowranceusr4 writer issues. when writing embedded UTF-16LE strings in lowranceusr version >=4 don't inlucde BOM. don't offset returned values from lowranceusr4_jd_from_timestamp by 12 hours, thus matching the inverse transformation in lowranceusr4_get_timestamp. when writing lowranceusr version >=4 trails output the given number of mysterious attribute bytes, i.e. 0. This almost enables a gpx -> usr -> gpx test loop, which is included but commented in lowranceusr.test. * fixes to enable lowranceusr v4 round trip testing. use templates for lowranceusr*_find_desc_from_icon_number and lowranceusr*_find_icon_number_from_desc. enhance lowranceusr*_find_icon_number_from_desc to recongnize icon-n where n is an integer as icon number n. This is necessary for the v4 round trip test. declare lowranceusr*_find_desc_from_icon_number to be static to limit visibilty. Drop const return type. declare lowranceusr4_find_color_from_icon_number_plus_color_index to be static to limit visiblity. * fix new lowranceusr memory leak. --- lowranceusr.cc | 116 +++++++++++++++-------------- reference/lowrance-enchilada.usr | Bin 2993 -> 2993 bytes reference/lowrance-ignoreicons.usr | Bin 2901 -> 2901 bytes reference/lowrance.usr | Bin 622 -> 622 bytes testo.d/lowranceusr.test | 30 ++++---- 5 files changed, 76 insertions(+), 70 deletions(-) diff --git a/lowranceusr.cc b/lowranceusr.cc index 46b3fd7af..7fe9b7bd6 100644 --- a/lowranceusr.cc +++ b/lowranceusr.cc @@ -97,6 +97,7 @@ #include // for QLatin1String #include // for QString, operator+, operator==, operator!= #include // for QTextCodec +#include // for QTextEncoder #include // for QTime #include // for CaseInsensitive, UTC #include // for qPrintable, uint, foreach @@ -557,7 +558,9 @@ lowranceusr4_writestr(const QString& buf, gbfile* file, int bytes_per_char) if (bytes_per_char == 1) { qba = buf.toUtf8(); } else { - qba = utf16le_codec->fromUnicode(buf); + QTextEncoder* encoder = utf16le_codec->makeEncoder(QTextCodec::IgnoreHeader); + qba = encoder->fromUnicode(buf); + delete encoder; } int len = qba.size(); gbfputint32(len, file_out); @@ -574,18 +577,17 @@ lowranceusr4_get_timestamp(unsigned int jd_number, unsigned int msecs) static Lowranceusr4Timestamp lowranceusr4_jd_from_timestamp(gpsbabel::DateTime qdt) { - QDateTime jdt = qdt.toUTC().addSecs(-60 * 60 * 12); + QDateTime jdt = qdt.toUTC(); unsigned int jd_number = jdt.date().toJulianDay(); QTime jd_time = jdt.time(); unsigned int msecs = (((((jd_time.hour() * 60) + jd_time.minute()) * 60) + jd_time.second()) * 1000) + jd_time.msec(); return Lowranceusr4Timestamp(jd_number, msecs); } - -const QString -lowranceusr_find_desc_from_icon_number(const int icon) +template +static QString lowranceusr_common_find_desc_from_icon_number(const int icon, const T icon_value_table[]) { - for (const lowranceusr_icon_mapping_t* i = lowranceusr_icon_value_table; i->icon; i++) { + for (const T* i = icon_value_table; i->icon; i++) { if (icon == i->value) { return i->icon; } @@ -595,70 +597,58 @@ lowranceusr_find_desc_from_icon_number(const int icon) return QString("icon-%1").arg(icon); } -static int -lowranceusr_find_icon_number_from_desc(const QString& desc) +template +static int lowranceusr_common_find_icon_number_from_desc(const QString& desc, const T icon_value_table[], const int def_icon) { if (desc.isNull()) { - return DEF_ICON; + return def_icon; } /* * If we were given a numeric icon number as a description * (i.e. 8255), just return that. + * Also return the icon number for descriptions of "icon-" + * followed by a numeric icon number. */ - int n = desc.toInt(); + int n = desc.mid(desc.startsWith("icon-") ? 5 : 0).toInt(); if (n) { return n; } - for (const lowranceusr_icon_mapping_t* i = lowranceusr_icon_value_table; i->icon; i++) { + for (const T* i = icon_value_table; i->icon; i++) { if (desc.compare(i->icon,Qt::CaseInsensitive) == 0) { return i->value; } } - return DEF_ICON; + return def_icon; } -const QString -lowranceusr4_find_desc_from_icon_number(const int icon) +static QString +lowranceusr_find_desc_from_icon_number(const int icon) { - for (const lowranceusr4_icon_mapping_t* i = lowranceusr4_icon_value_table; i->icon; i++) { - if (icon == i->value) { - return i->icon; - } - } - - // Didn't find it in table, default to leave it as the number found - return QString("icon-%1").arg(icon); + return lowranceusr_common_find_desc_from_icon_number(icon, lowranceusr_icon_value_table); } static int -lowranceusr4_find_icon_number_from_desc(const QString& desc) +lowranceusr_find_icon_number_from_desc(const QString& desc) { - if (desc.isNull()) { - return DEF_USR4_ICON; - } - - /* - * If we were given a numeric icon number as a description - * (i.e. 8255), just return that. - */ - int n = desc.toInt(); - if (n) { - return n; - } + return lowranceusr_common_find_icon_number_from_desc(desc, lowranceusr_icon_value_table, DEF_ICON); +} - for (const lowranceusr4_icon_mapping_t* i = lowranceusr4_icon_value_table; i->icon; i++) { - if (desc.compare(i->icon,Qt::CaseInsensitive) == 0) { - return i->value; - } - } +static QString +lowranceusr4_find_desc_from_icon_number(const int icon) +{ + return lowranceusr_common_find_desc_from_icon_number(icon, lowranceusr4_icon_value_table); +} - return DEF_USR4_ICON; +static int +lowranceusr4_find_icon_number_from_desc(const QString& desc) +{ + return lowranceusr_common_find_icon_number_from_desc(desc, lowranceusr4_icon_value_table, DEF_USR4_ICON); } -const char * +static const char * lowranceusr4_find_color_from_icon_number_plus_color_index(const int icon, const int index) { for (const lowranceusr4_icon_mapping_t* i = lowranceusr4_icon_value_table; i->icon; i++) { @@ -799,13 +789,13 @@ lat_mm_to_deg(double x) static long lon_deg_to_mm(double x) { - return (long)(x * SEMIMINOR * DEGREESTORADIANS); + return round(x * SEMIMINOR * DEGREESTORADIANS); } static long lat_deg_to_mm(double x) { - return (long)(SEMIMINOR * log(tan((x * DEGREESTORADIANS + M_PI / 2.0) / 2.0))); + return round(SEMIMINOR * log(tan((x * DEGREESTORADIANS + M_PI / 2.0) / 2.0))); } @@ -1802,11 +1792,13 @@ lowranceusr_waypt_disp(const Waypoint* wpt) static void lowranceusr4_waypt_disp(const Waypoint* wpt) { + lowranceusr4_fsdata* fs = (lowranceusr4_fsdata*) fs_chain_find(wpt->fs, FS_LOWRANCEUSR4); + /* UID unit number */ if (opt_serialnum_i > 0) { gbfputint32(opt_serialnum_i, file_out); // use option serial number if specified - } else if (wpt->fs != nullptr) { - gbfputint32(((lowranceusr4_fsdata*)(wpt->fs))->uid_unit, file_out); // else use serial number from input if valid + } else if (fs != nullptr) { + gbfputint32(fs->uid_unit, file_out); // else use serial number from input if valid } else { gbfputint32(0, file_out); // else Write Serial Number = 0 } @@ -1840,8 +1832,8 @@ lowranceusr4_waypt_disp(const Waypoint* wpt) ColorId = 0; // default } else { SymbolId = lowranceusr4_find_icon_number_from_desc(wpt->icon_descr); - if (wpt->fs != nullptr) { - ColorId = lowranceusr4_find_index_from_icon_desc_and_color_desc(wpt->icon_descr, ((lowranceusr4_fsdata*)(wpt->fs))->color_desc); + if (fs != nullptr) { + ColorId = lowranceusr4_find_index_from_icon_desc_and_color_desc(wpt->icon_descr, fs->color_desc); } else { ColorId = DEF_USR4_COLOR; // default } @@ -1869,8 +1861,8 @@ lowranceusr4_waypt_disp(const Waypoint* wpt) gbfputc(0, file_out); /* Depth in feet */ - if (wpt->fs != nullptr) { - gbfputint32(((lowranceusr4_fsdata*)(wpt->fs))->depth, file_out); + if (fs != nullptr) { + gbfputint32(fs->depth, file_out); } else { gbfputint32(0, file_out); // zero seems to indicate no depth } @@ -2054,11 +2046,13 @@ lowranceusr4_route_hdr(const route_head* rte) route_uid, qPrintable(rte->rte_name), rte->rte_waypt_ct); } + lowranceusr4_fsdata* fs = (lowranceusr4_fsdata*) fs_chain_find(rte->fs, FS_LOWRANCEUSR4); + /* UID unit number */ if (opt_serialnum_i > 0) { gbfputint32(opt_serialnum_i, file_out); // use option serial number if specified - } else if (rte->fs != nullptr) { - gbfputint32(((lowranceusr4_fsdata*)(rte->fs))->uid_unit, file_out); // else use serial number from input if valid + } else if (fs != nullptr) { + gbfputint32(fs->uid_unit, file_out); // else use serial number from input if valid } else { gbfputint32(0, file_out); // else Write Serial Number = 0 } @@ -2083,8 +2077,15 @@ lowranceusr4_route_leg_disp(const Waypoint* wpt) for (int i = 0; i < waypt_table_ct; i++) { Waypoint* cmp = waypt_table[i]; if (cmp->shortname == wpt->shortname) { - lowranceusr4_fsdata* fsdata = (lowranceusr4_fsdata*)cmp->fs; - gbfputint32(fsdata->uid_unit, file_out); // serial number from input if valid + lowranceusr4_fsdata* fs = (lowranceusr4_fsdata*) fs_chain_find(cmp->fs, FS_LOWRANCEUSR4); + + if (opt_serialnum_i > 0) { + gbfputint32(opt_serialnum_i, file_out); // use option serial number if specified + } else if (fs != nullptr) { + gbfputint32(fs->uid_unit, file_out); // else use serial number from input if valid + } else { + gbfputint32(0, file_out); // else Write Serial Number = 0 + } gbfputint32(i, file_out); // Sequence Low gbfputint32(0, file_out); // Sequence High if (global_opts.debug_level > 1) { @@ -2232,9 +2233,10 @@ lowranceusr4_trail_hdr(const route_head* trail) /* Mysterious "data count" and "data type" stuff */ gbfputint32(0, file_out); - gbfputc(0, file_out); - gbfputc(0, file_out); - gbfputc(0, file_out); +// /* If we hadn't forced the count to zero we would need something like: */ +// for (int i=0; i< attr_count; ++i) { +// gbfputc(0, file_out); +// } /* Trackpoint count */ gbfputint32(trail->rte_waypt_ct, file_out); diff --git a/reference/lowrance-enchilada.usr b/reference/lowrance-enchilada.usr index 3fb9c994b7c6753fafbd46400896b5f879b26ede..ee167782ec1d21fe6a94ac7096d73dcbd517eafb 100644 GIT binary patch literal 2993 zcma*peN5F=9LMogEq|d02`Y9BUCd9OKA=*Q_#5CE%3r+TrVYRVNlMH z9tPG*XAkxum1AZswS36Zo3>=t%5rTjYqoG|Hp|SZx6k_v=l;V|+}vJ#&-wj+=XcKe zocl|0&JET7=37hLz6;9|KQtv0Y5IFcFdD9oJS@4+-f6=|jza;r@s<*I;e21WA*$R_ z7Y)xsTTscM@Ui-v-=^y)t5dtK(Xt5>}Lf$3^1ek2r$<&^5Np=eG4 zz4@1K&mH30ZYyzn`ky%mvT7|&(*$2B1U$4Dd@f7}UkYX5fKcu$3&4I=!hp^;W4y&ftgU?jy0u0O+_hVr@6~DRdEqbVIQPX#zOE?TR2)}_>gWo za6e#R^FfDD4%P_szuz8tgsJQlqJSA|^k@c5-73JWb^toB1sph2tHYr{ zT)B%|?hY^~@hS7??Zua5_zFOG^;DF+rww3;zIS z`!B%!p9HMPIgrd9mEqinw5EVBgtPuCt6U_TtdV7tHL{_ypmu0bnZykl*c3p@?1Z^U zHhH>blg>7)yy-G7C#_HV`#j?-F92d|*#wqNjw8z^!>|p&zOrmGX4@?c)%FkB{FeKW z&7VQ1VA*_4xKuWuP#?=CF&UW6;cVTInlivVVI-I>WP!Otwr{d*KA_5AvN?;ZmZ-A@ zutl&)l1)n@*_=zCwSwjM4WW_>>mCB^4FkJnA(dT1Jz&Nxo4~Tk)LAx}Rm&!wEt^c{ zYOdmNwmzVR3U^)#whD{Dhk~60On4QQw*)&_)(Q3&?H;XyjhVy8uvDkJIL9VgDVzq+3wB&{ zfS;towmAkkjJZ}QTvlEblb%3qD8gK%%d00T` zW04_EF`D=hv{+HGA3-j!poyf+0z9G=@X%t9BEZ0I^0*POxVfNPxEk<` zD-?pGf}KAn1UrBD__1$;vx0paa8L*7%o$z-vIIMSvW3M|ZV>F`pCGhQnIyCVKG^I# wZMyI>m6?K_NaezMDq-P0P%mr-{77vB{A}$4e1ylr3c-%1R^cF(Ho>;df7AXBa{vGU literal 2993 zcma*pe`u9e9LMom6S2vUK=k ziIE#&X@!goR8mn^;?y#;th}{;jEd0KAAu3o!d6MYtlaJM{%+^OSmhOj*S_aG&vTx0 z&ga}G%Q-hn|6A@ZcU}F>sn0j0QaSp2ZYUmUh}B7Me{aQAVvcJ zV?07j$M?QZmU~lucBcmVWUH+z5f6t}(yQ}=?=`}mRIlXV19R0@`fxaw2v+K`;dro! z-u#(;ZIqS4^I zrdS~4@+O7cdQDxo-XyR=;FSVYPJuPTaS#(aL7i|2)C&8+d|@vr7uvyWVF#EcYy&fe zC&2B(7BErR1a21AfpJ0t0Vq zC=)zv7&O_yXey?Ohn9hNg-Y;&Pz62|YJ6om=u#yD=xj5_Tdb#YMzHCn=}BLC7QCa% zE{_)huiOC`hAr-E!bx9A0*2ZRjtOT$hj1S36TStzgkJER&^qC)N_gWECn58ePkMNb3mjzVMe% zt5q_|CTnCvWkD^QRAzBQ23874nZ4=%WRs^`HtB4$%9}QGIg#A#?_;Y&#j;6kEt_Cy zHW`L(0QS|;Y%*EF&UoCT(<5*YO;_n7A%_&3gc;7 zDBKEYvTQCBGS22&b+!Pu2n4%O)6_ zO=i`yNoUI@llcsnbK+Tk!DcGlxfvW665yy{=KvF4Pi3!QgMZ$GGteqq1sgN-Y*;7Q z>#P#&fQkqYa34;yQovzY3~B|N%o?GP3Ws5V$1Q-Fx3%CZTc!r#8k%@SHb^fn!}y!s z^0@Fj*e2L<%>n*16}HUhJ zDx3gq9u^S#SY$|3f+l_hEmlRK65$ z178W#z}Lb|&@0$+3heyp6YTuq@KN2N{Z G0sjEPLJo2O diff --git a/reference/lowrance-ignoreicons.usr b/reference/lowrance-ignoreicons.usr index c52c15aff21a538bf820151d1502d1219d51827e..9e6ba6ab376d3b01964aa4ef8c3322ed8c35c64b 100644 GIT binary patch literal 2901 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 Iv(N|r0dHdTc>n+a diff --git a/reference/lowrance.usr b/reference/lowrance.usr index 56a6ff70a1a6a370dad937f34f5402c4f6040473..39e8091b9f59420c9c57512ed5c7c9e2cc1c9935 100644 GIT binary patch delta 64 zcmaFI@{Wa diff --git a/testo.d/lowranceusr.test b/testo.d/lowranceusr.test index 1625a96cd..ee13bfc6d 100644 --- a/testo.d/lowranceusr.test +++ b/testo.d/lowranceusr.test @@ -1,7 +1,7 @@ # # Lowrance USR # ============ -# +# # Binary data format, and slightly lossy because of the math to # convert lat/long. # @@ -18,11 +18,11 @@ # Trail 'Trail 1' conains 0 points, Trail 'Bull Run' contains 97 points in a # single section, Trail 'Hike' contains 198 points in a single section. # -# lowrance-enchilada.usr USR version 2 format file. +# lowrance-enchilada.usr USR version 2 format file. # Used to validate that GPX file generated from lowrance-all.usr # when converted back to USR v2 matches previous executions of GPSBabel. # -# lowrance-ignoreicons.usr USR version 2 format file. +# lowrance-ignoreicons.usr USR version 2 format file. # Used to validate use of ignoreicons option to strip out Event Marker Icons. # # lowrance-v2.usr USR version 2 format file. Generated on an unknown Lowrance unit. @@ -30,7 +30,7 @@ # Each trail is named 'Trail 1'. # The first 'Trail 1' has 2000 points boken into 10 sections with 200 points # in each section. The second 'Trail 1' has 1258 points broken into 7 sections, -# with 200 points in 6 and 58 in the last. +# with 200 points in 6 and 58 in the last. # # lowrance-v2-unicsv.txt Comma seperated file generated from lowrance-v2.usr by GPSBabel. # Used to validate that the parsing of the USR version 2 file yields the same @@ -68,22 +68,22 @@ rm -f ${TMPDIR}/lowrance* # Test ability to read non-Lowrance format and generate USR v2 file gpsbabel -i geo -f ${REFERENCE}/../geocaching.loc -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance1.usr -bincompare ${TMPDIR}/lowrance1.usr ${REFERENCE}/lowrance.usr +bincompare ${REFERENCE}/lowrance.usr ${TMPDIR}/lowrance1.usr # Use the file just created to see if can write back the same data -gpsbabel -i lowranceusr -f ${TMPDIR}/lowrance1.usr -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance1.usr -# Unfortunately precision issues cause mismatch on Lat/Long conversion, actual test validation commented out -# bincompare ${REFERENCE}/lowrance.usr ${TMPDIR}/lowrance1.usr +gpsbabel -i lowranceusr -f ${TMPDIR}/lowrance1.usr -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance2.usr +# At a minimum unknown altitude not making the round trip, actual test validation commented out +# bincompare ${REFERENCE}/lowrance.usr ${TMPDIR}/lowrance2.usr # Test ability to generate GPX from USR v2 and then generate USR v2 using that newly created GPX file gpsbabel -i lowranceusr -f ${REFERENCE}/lowrance-all.usr -o gpx,elevprec=6 -F ${TMPDIR}/lowrance-enchilada.gpx -gpsbabel -i gpx -f ${TMPDIR}/lowrance-enchilada.gpx -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance-enchilada1.usr -bincompare ${TMPDIR}/lowrance-enchilada1.usr ${REFERENCE}/lowrance-enchilada.usr +gpsbabel -i gpx -f ${TMPDIR}/lowrance-enchilada.gpx -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance-enchilada.usr +bincompare ${REFERENCE}/lowrance-enchilada.usr ${TMPDIR}/lowrance-enchilada.usr # Don't convert icons as waypts gpsbabel -i lowranceusr,ignoreicons -f ${REFERENCE}/lowrance-all.usr -o gpx,elevprec=6 -F ${TMPDIR}/lowrance-enchilada.gpx -gpsbabel -i gpx -f ${TMPDIR}/lowrance-enchilada.gpx -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance-enchilada1.usr -bincompare ${TMPDIR}/lowrance-enchilada1.usr ${REFERENCE}/lowrance-ignoreicons.usr +gpsbabel -i gpx -f ${TMPDIR}/lowrance-enchilada.gpx -o lowranceusr,wversion=2 -F ${TMPDIR}/lowrance-ignoreicons.usr +bincompare ${REFERENCE}/lowrance-ignoreicons.usr ${TMPDIR}/lowrance-ignoreicons.usr # # Another variation of Lowrance. Compare v2 and v3. These reference @@ -105,7 +105,7 @@ compare ${TMPDIR}/lowrance-v2-unicsv-sorted.txt ${TMPDIR}/lowrance-v3-unicsv-nod # # ${REFERENCE}/lowrance-hook2-v2.usr, ${REFERENCE}/lowrance-hook2-v3.usr, -# ${REFERENCE}/lowrance-hook2-v4.usr, ${REFERENCE}/lowrance-hook2-v5.usr, ${REFERENCE}/lowrance-hook2-v6.usr +# ${REFERENCE}/lowrance-hook2-v4.usr, ${REFERENCE}/lowrance-hook2-v5.usr, ${REFERENCE}/lowrance-hook2-v6.usr # AND ${REFERENCE}/lowrance-hook2.gpx were generated on a single Lowrance Hook2 System. # This system has the ability to select any one of those formats for database export. # All files should contain the same basic data with increasing amounts of detail as you @@ -117,6 +117,10 @@ compare ${TMPDIR}/lowrance-v2-unicsv-sorted.txt ${TMPDIR}/lowrance-v3-unicsv-nod gpsbabel -i lowranceusr -f ${REFERENCE}/lowrance-v4.usr -o gpx -F ${TMPDIR}/lowrance-v4.gpx compare ${REFERENCE}/lowrance-v4.gpx ${TMPDIR}/lowrance-v4.gpx +gpsbabel -i gpx -f ${TMPDIR}/lowrance-v4.gpx -o lowranceusr,wversion=4 -F ${TMPDIR}/lowrance-v4.usr +gpsbabel -i lowranceusr -f ${TMPDIR}/lowrance-v4.usr -o gpx -F ${TMPDIR}/lowrance-v4~usr.gpx +compare ${TMPDIR}/lowrance-v4.gpx ${TMPDIR}/lowrance-v4~usr.gpx + # # Perform USR version 5 test # ------------- -- 2.30.2